package br.ufrn.sipac.patrimonio.coletor.activity;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import br.ufrn.sipac.patrimonio.auxiliares.ConstantesOperacoes;
import br.ufrn.sipac.patrimonio.auxiliares.TipoStatusBem;
import br.ufrn.sipac.patrimonio.coletor.R;
import br.ufrn.sipac.patrimonio.coletor.controller.DatabaseController;
import br.ufrn.sipac.patrimonio.coletor.controller.LevantamentoController;
import br.ufrn.sipac.patrimonio.coletor.controller.MainController;
import br.ufrn.sipac.patrimonio.coletor.dominio.Bem;
import br.ufrn.sipac.patrimonio.coletor.dominio.FinalidadeLevantamento;
import br.ufrn.sipac.patrimonio.coletor.dominio.ItemLevantamento;
import br.ufrn.sipac.patrimonio.coletor.dominio.Levantamento;
import br.ufrn.sipac.patrimonio.coletor.dominio.Localidade;
import br.ufrn.sipac.patrimonio.coletor.dominio.Persistencia;
import br.ufrn.sipac.patrimonio.coletor.dominio.Unidade;
import br.ufrn.sipac.patrimonio.coletor.dominio.UsuarioColetor;
import br.ufrn.sipac.patrimonio.coletor.exception.DatabaseException;
import br.ufrn.sipac.patrimonio.coletor.exception.NegocioException;

/**
 * Essa activity contém a lista de levantamentos feitos com o coletor.
 * 
 * @author Giuliana Silva Bezerra
 * 
 */
public class ListaLevantamentoActivity extends Activity {
	private ListView table;
	private static final String HEADER = "Data              Finalidade     Local         Usuario";
	List<Persistencia> levantamentos;

	@SuppressLint("SimpleDateFormat")
	@SuppressWarnings("unchecked")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_lista_levantamento);

		// Mapear os componente da tela
		table = (ListView) findViewById(R.id.SCHEDULE);
		ListView header = (ListView) findViewById(R.id.list_header_title);

		ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
		ArrayList<HashMap<String, String>> headerList = new ArrayList<HashMap<String, String>>();
		HashMap<String, String> map = new HashMap<String, String>();

		// Adiciona cabeçalho da tabela
		map.put("Title", HEADER);
		headerList.add((HashMap<String, String>) map.clone());
		map.clear();

		SimpleAdapter headerAdapter = new SimpleAdapter(this, headerList,
				R.layout.list_header, new String[] { "Title" },
				new int[] { R.id.list_header_title });
		header.setAdapter(headerAdapter);

		try {
			if (MainController.getTipoOperacao() == ConstantesOperacoes.OPERACAO_CONTINUAR_LEVANTAMENTO
					|| MainController.getTipoOperacao() == ConstantesOperacoes.OPERACAO_FINALIZAR_LEVANTAMENTO) {
				// Busca pelos levantamentos pendentes
				levantamentos = DatabaseController
						.getLevantamentosPendentes(this);

				// Nenhum levantamento cadastrado
				if (levantamentos.isEmpty())
					throw new NegocioException(
							"Não há levantamentos pendentes.", this);
			} else {
				// Busca pelos levantamentos cadastrados
				levantamentos = DatabaseController.getAllLevantamentos(this);

				// Nenhum levantamento cadastrado
				if (levantamentos.isEmpty())
					throw new NegocioException(
							"Não há levantamentos cadastrados.", this);
			}

			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			for (Persistencia obj : levantamentos) {
				Levantamento levantamento = (Levantamento) obj;
				map.put("Data", sdf.format(levantamento.getDataCadastro()));
				FinalidadeLevantamento finalidade = (FinalidadeLevantamento) DatabaseController
						.findFinalidadeById(this, levantamento.getTipo()
								.getId());
				map.put("Finalidade", finalidade.getDenominacao().trim());
				Localidade localidade = (Localidade) DatabaseController
						.findLocalidadeById(this, levantamento.getLocal()
								.getId());
				map.put("Local", localidade.getCodigo().trim());
				UsuarioColetor usuario = null;
				if (levantamento.getUsuario() != null)
					usuario = (UsuarioColetor) DatabaseController
							.findUsuarioById(this, levantamento.getUsuario()
									.getId());
				map.put("Usuario", usuario == null ? "--" : usuario.getLogin());
				mylist.add((HashMap<String, String>) map.clone());
				map.clear();
			}

			ListAdapter mSchedule = new SimpleAdapter(this, mylist,
					R.layout.levantamento_linhas, new String[] { "Data",
							"Finalidade", "Local", "Usuario" }, new int[] {
							R.id.DATA_CELL, R.id.FINALIDADE_CELL,
							R.id.LOCALIDADE_CELL, R.id.USUARIO_CELL });
			table.setAdapter(mSchedule);
		} catch (NegocioException e) {
		} catch (DatabaseException e) {
		}

		// Adicionar listeners
		table.setOnItemClickListener(new ItemMenuListener());
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.lista_levantamento, menu);
		return true;
	}

	private void selecionaLevantamento(int itemSelecionado) {
		Levantamento levantamento = (Levantamento) levantamentos
				.get(itemSelecionado);

		Collection<Persistencia> bensNaoInventariados = new ArrayList<Persistencia>();
		Collection<Persistencia> bensAlienados = new ArrayList<Persistencia>();
		Collection<Persistencia> bensMovAberto = new ArrayList<Persistencia>();
		Collection<Persistencia> bensInventariados = new ArrayList<Persistencia>();
		Collection<Persistencia> bensNaoCadastrados = new ArrayList<Persistencia>();

		try {
			// Preenche dos dados da localidade
			Localidade localidade = levantamento.getLocal();
			localidade = (Localidade) DatabaseController.findLocalidadeById(
					this, localidade.getId());

			// Preenche os dados da finalidade
			FinalidadeLevantamento finalidade = levantamento.getTipo();
			finalidade = (FinalidadeLevantamento) DatabaseController
					.findFinalidadeById(this, finalidade.getId());

			Collection<Persistencia> itens = DatabaseController
					.findItensByLevantamento(this, levantamento.getId());

			Collection<Persistencia> bens = new ArrayList<Persistencia>();
			Unidade unidade = localidade.getUnidade();
			unidade = (Unidade) DatabaseController.findUnidadeById(this,
					unidade.getId());

			if (unidade != null) {
				bens = DatabaseController.findBensByUnidade(unidade.getId(),
						this);
				Persistencia objUni = DatabaseController.findUnidadeById(this,
						unidade.getId());
				unidade = (Unidade) objUni;
			}

			for (Persistencia persistencia : itens) {
				ItemLevantamento objeto = (ItemLevantamento) persistencia;
				if (objeto.getBem() != null) {
					// Popula os dados do bem
					Bem objetoBem = (Bem) DatabaseController.findBemById(this,
							objeto.getBem().getId());
					if (objetoBem != null && objetoBem.getId() != 0) {
						unidade = new Unidade(objetoBem.getUnidade().getId());
						break;
					}
				}
			}

			Iterator<Persistencia> it = itens.iterator();
			Vector<String> vec = new Vector<String>();
			while (it.hasNext()) {
				ItemLevantamento item = (ItemLevantamento) it.next();
				vec.addElement(item.toString());
				if (item.getMarca() != null) {
					bensNaoCadastrados.add(item);
				} else if (item.getBem().getStatus() == TipoStatusBem.ALIENADO) {
					bensAlienados.add(item);
					bens.remove(item.getBem());
				} else if (item.getBem().getStatus() == TipoStatusBem.EM_MOVIMENTACAO) {
					bensMovAberto.add(item);
					bens.remove(item.getBem());
				} else {
					bensInventariados.add(item);
					bens.remove(item.getBem());
				}
			}
			// Adiciona bens não inventariados
			ItemLevantamento itemNaoInventariado = new ItemLevantamento();
			for (Persistencia bem : bens) {
				itemNaoInventariado = new ItemLevantamento();
				itemNaoInventariado.setBem((Bem) bem);
				bensNaoInventariados.add(itemNaoInventariado);
			}

			if (MainController.getTipoOperacao() == ConstantesOperacoes.OPERACAO_CONTINUAR_LEVANTAMENTO) {
				Intent intent = new Intent(this, LeituraActivity.class);
				LevantamentoController.getInstance().setLevantamento(levantamento);
				MainController.setBensBaixados(bensAlienados);
				MainController.setBensNaoCadastrados(bensNaoCadastrados);
				MainController.setBensNaoInventariados(bensNaoInventariados);
				MainController.setBensInventariados(bensInventariados);
				LevantamentoController.getInstance().getLevantamento().setTipo(finalidade);
				LevantamentoController.getInstance().getLevantamento().setDescricao(levantamento
						.getDescricao());
				LevantamentoController.getInstance().getLevantamento().getLocal().setUnidade(unidade);
				finish();
				startActivity(intent);
			} else if (MainController.getTipoOperacao() == ConstantesOperacoes.OPERACAO_VISUALIZAR) {
				Intent intent = new Intent(this, VisualizarActivity.class);
				LevantamentoController.getInstance().setLevantamento(levantamento);
				MainController.setBensBaixados(bensAlienados);
				MainController.setBensNaoCadastrados(bensNaoCadastrados);
				MainController.setBensNaoInventariados(bensNaoInventariados);
				MainController.setBensInventariados(bensInventariados);
				LevantamentoController.getInstance().getLevantamento().setLocal(localidade);
				LevantamentoController.getInstance().getLevantamento().getLocal().setUnidade(unidade);
				LevantamentoController.getInstance().getLevantamento().setTipo(finalidade);
				LevantamentoController.getInstance().getLevantamento().setDescricao(levantamento
						.getDescricao());
				MainController.setCountBensBaixados(bensAlienados.size());
				MainController.setCountBensInventariados(bensInventariados
						.size());
				MainController.setCountBensNaoCadastrados(bensNaoCadastrados
						.size());
				MainController
						.setCountBensNaoInventariados(bensNaoInventariados
								.size());
				finish();
				startActivity(intent);
			} else if (MainController.getTipoOperacao() == ConstantesOperacoes.OPERACAO_FINALIZAR_LEVANTAMENTO) {
				if ((levantamento.getUsuario() == null || levantamento
						.getUsuario().getId() == 0)
						|| (LevantamentoController.getInstance().getLevantamento().getUsuario() == null || LevantamentoController.getInstance().getLevantamento()
								.getUsuario().getId() == 0)) {
					Intent intent = new Intent(this,
							AutenticarFinalizarActivity.class);
					LevantamentoController.getInstance().setLevantamento(levantamento);
					LevantamentoController.getInstance().setItens(itens);
					LevantamentoController.getInstance().getLevantamento().getLocal().setUnidade(unidade);
					finish();
					startActivity(intent);
				}
			}
		} catch (DatabaseException e) {
		}
	}

	/**
	 * Carrega menu da aplicação.
	 */
	private void iniciaMenu() {
		finish();
		Intent intent = new Intent(this, MenuActivity.class);
		startActivity(intent);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.item2:
			iniciaMenu();
		case R.id.item1:
			finish();
		}
		return false;
	}

	public class ItemMenuListener implements OnItemClickListener {
		@Override
		public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
				long arg3) {
			// arg1 é o componente
			selecionaLevantamento(arg2);
		}
	}

	@Override
	public void onBackPressed() {
		iniciaMenu();
	}
}
